﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;
using Sinacor.Servico.Bovespa.Corretagem.ResourceAccess;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation
{
    /// <summary>
    /// Validação de negócios
    /// </summary>
    public class ValidadorFaixaComissao : BaseBusinessRuleValidation<BusinessEntity.FaixaComissao>, IBusinessRuleValidation
    {
        #region Métodos

        /// <summary>
        /// Captura os erros
        /// </summary>
        /// <returns>Retorno uma lista de erros</returns>
        public List<ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        /// <summary>
        /// Valida os campos obrigatórios
        /// </summary>
        private void ValidarCamposObrigatorios()
        {
            SinacorValidation validation = null;

            try
            {
                validation = new SinacorValidation();
                validation.Validate<BusinessEntity.FaixaComissao>(base.EntityToValidate);
                validation.Validate();
            }
            catch (ValidationException ve)
            {
                base.AddValidationError(ve.ValidationErrors);
            }
        }

        /// <summary>
        /// Valida o negócio
        /// </summary>
        private void ValidarNegocio()
        {
            ResourceAccess.FaixaComissao raFaixaComissao = new ResourceAccess.FaixaComissao();
            BusinessEntity.Parameter.FiltroFaixaComissaoChave faixaComissaoChave = null;
            BusinessEntity.FaixaComissao faixaComissao = null;
            
            faixaComissaoChave = new BusinessEntity.Parameter.FiltroFaixaComissaoChave
            {
                NumeroFaixa = (base.EntityToValidate.NumeroFaixa.HasValue ? base.EntityToValidate.NumeroFaixa.Value : 0)
            };

            // Obter a faixa de comissão que foi anteriormente cadastrada
            faixaComissao = raFaixaComissao.ObterFaixaComissaoAnterior(faixaComissaoChave);

            if (faixaComissao != null)
            {
                if (base.EntityToValidate.ValorInferior <= faixaComissao.ValorSuperior)
                {
                    base.AddValidationError(109454);
                }
            }

            faixaComissaoChave = new BusinessEntity.Parameter.FiltroFaixaComissaoChave
            {
                NumeroFaixa = (base.EntityToValidate.NumeroFaixa.HasValue ? base.EntityToValidate.NumeroFaixa.Value : 0)
            };

            // Obter a faixa de comissão que foi posteriormente cadastrada
            faixaComissao = raFaixaComissao.ObterFaixaComissaoPosterior(faixaComissaoChave);
               
            if (faixaComissao != null)
            {
               if (base.EntityToValidate.ValorSuperior >= faixaComissao.ValorInferior)
               {
                  base.AddValidationError(109455);
               }
            }

            if (base.EntityToValidate.ValorInferior.HasValue && base.EntityToValidate.ValorSuperior.HasValue)
            {
                if (base.EntityToValidate.ValorInferior > base.EntityToValidate.ValorSuperior)
                {
                    base.AddValidationError(109390);
                }
            }             
        }

        /// <summary>
        /// Validação
        /// </summary>
        public void Validate()
        {
            if (base.EntityToValidate == null)
            {
              base.AddValidationError(109392);
            }
           
            this.ValidarCamposObrigatorios();
            this.ValidarNegocio();
        }

        #endregion
    }

}